/***********************************************************************************
 * 文件名： ptc.c
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		PTC通信接口物理层协议实现、基础数据包格式的实现。仅支持主机模式。
 * 		PTC通信接口更多细节参考《PTC通信接口》文档。
 * 		本文件提供了以下接口：
 * 		PTC_Start:  开始通信
 * 		PTC_Stop: 结束通信
 * 		PTC_Send:  发送一个数据包
 * 		PTC_Receive:  接收一个数据包
 * 		PTC_TemporaryPower: 临时强供电
 * 		使用流程: 先调用 PTC_Start 如果成功说明已经与从机建立通信，
 * 	之后调用 PTC_Send PTC_Receive 发送或者接收数据，最后调用 PTC_Stop 结束本次通信。
 * 修改记录：
 * 	2020/5/28: 初版。 刘言。
***********************************************************************************/
#ifndef _PTC_H_
#define _PTC_H_

#include "typedef.h"
#include "app_config.h"


//调用的外部接口定义，便于移植

#define PTC_REQUEST							/*申请独占输出与ADC硬件*/
#define PTC_RELEASE			{PORT1_HZ_IN;PORT2_PP_OUT;PORT2_O = 0;PORT2_DIGIT;}	/*释放输出与ADC硬件*/

#define PTC_ENTER_CRI		SYS_DISABLE_INT()		/*关中断*/
#define PTC_EXIT_CRI		SYS_ENABLE_INT()		/*开中断*/

// #define PTC_CHECK_LOAD()	Board_ATCheckIn()		/*检测是否存在负载*/
#define PTC_POWER_OFF		Board_ATOutOff()			/*彻底断电*/
#define PTC_DELAY_MS		Delay_ms																		/*延时*/
#define PTC_STRONG_OUT		{if(!Board_ATOutOn())return PTC_BUS_ERROR;}						/*强输出*/
#define PTC_OUT_CHECK		/*输出状态判断，当有短路中断响应机制时需要*/
#define PTC_WEAK_OUT		{PORT1_O = 1;PORT1_PP_OUT;PORT2_HZ_IN;OE_OFF;}		/*弱输出*/
#define PTC_SET_ADC			{PORT2_ANALOG; Delay_us(100);}	/*可能需要的额外配置ADC，至少耗时100us*/
#define PTC_GET_ADV			Adc_GetOnce(OVALUE2)		/*获取AD值*/
#define PTC_DELAY_US		Delay_us		
#define PTC_UPDATA_RES() 	Board_ATGetLoadRes()


#define PTC_DATA_OUT_H			PORT2_O = 1
#define PTC_DATA_OUT_L			PORT2_O = 0
#define PTC_READY_SEND		{PORT2_DIGIT;PORT2_PP_OUT;PTC_DATA_OUT_H;}
#define PTC_READY_RECEIVE	{PORT2_ANALOG;PORT2_HZ_IN;}


//参数设置

#define PTC_ADV_2200MV		APP_CFG_OVALUE_2200MV			//2.2V时的AD值
#define PTC_DIFF_ADV 		  APP_CFG_DIFF_ADV    	    // 电平跳变的差值


// 自定义类型

typedef enum _ptc_errcode
{
	PTC_SUCCESS=0,		//操作成功
	PTC_NORMAL_ATM = 0x86,		//常规雾化器（同步错误）
	PTC_RX_TIMEOUT = 0x87,		//接收超时
	PTC_CHECK_NO_PASS = 0x88,	//收到的数据包校验不通过
	PTC_AUTH_CODE_ERR = 0x89,	//收到的认证码错误
	PTC_BUS_ERROR = 0x8A,		//总线错误（硬件输出错误,一般是停止位接收错误）
	PTC_WAIT_READY_TIMEOUT = 0x8B,	//等待从机准备好超时（同步错误）
	PTC_UNKNOWN_ATM = 0x8C		//未知雾化器（收到的命令错误）
}ptc_errcode_t;


extern pdata u16 mRes;

// API

#define PTC_GetRes()	mRes

void PTC_Send(const u8 *buff, u8 len);
ptc_errcode_t PTC_Receive(u8 *buff,u8 *len);
ptc_errcode_t PTC_Start();
void PTC_Stop();
ptc_errcode_t PTC_TemporaryPower(u8 ms);

#endif
